package com.xiefengf.rabbitmq.consumer.service;

import com.xiefengf.rabbitmq.consumer.utils.StringUtils;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Service;

/**
 * @author xiefengf
 * @version 1.0
 * @date 2024/1/10 23:58
 *
 * RabbitListener中的bindings = @QueueBinding 的作用和在RabbitConfig中配置的Bean 1、创建队列、创建交换机、绑定关系的作用是一样的
 * 两者选其一，要么写配置类，要么写注解的形式（建议配置类）
 *
 */

@Service
public class DirectConsumerService {

    /**
     * @RabbitHandler 代表此方法是一个消息接收的方法。该不要有返回值
     * @RabbitListener 可作用于类上，即是整个类被监听，作用于方法上，此方法监听
     * @param msg
     */
    @RabbitListener(bindings = @QueueBinding(
            // value 对应的 是队列名字
            value = @Queue(value = StringUtils.DIRECT_QUEUE_NAME_1,autoDelete = "false"),
            // value 对应的 是交换机名字，type对应的是rabbitmq分发的模式 --- Direct模式(默认值)
            exchange = @Exchange(value = StringUtils.DIRECT_EXCHANGE_NAME,type = ExchangeTypes.DIRECT),
            // 路由key
            key = StringUtils.DIRECT_ROUTE_KEY_1
    ))
//    @RabbitListener(queues = {StringUtils.DIRECT_QUEUE_NAME_1}) // 消费者绑定队列
//    @RabbitListener(queuesToDeclare = @Queue("prefetch.queue")) // queuesToDeclare 自动声明队列
    @RabbitHandler
    public void weixinService(@Payload String msg){
        // 此处省略发邮件的逻辑
        System.out.println("weixin-----direct--------->" + msg);
    }


    /**
     * @RabbitHandler 代表此方法是一个消息接收的方法。该不要有返回值
     * @RabbitListener 可作用于类上，即是整个类被监听，作用于方法上，此方法监听
     * @param msg
     */
    @RabbitListener(bindings = @QueueBinding(
            // value 对应的 是队列名字
            value = @Queue(value = StringUtils.DIRECT_QUEUE_NAME_2,autoDelete = "false"),
            // value 对应的 是交换机名字，type对应的是rabbitmq分发的模式 --- Direct模式(默认值)
            exchange = @Exchange(value = StringUtils.DIRECT_EXCHANGE_NAME,type = ExchangeTypes.DIRECT),
            // 路由key
            key = StringUtils.DIRECT_ROUTE_KEY_2
    ))
    @RabbitHandler
    public void smsService(@Payload String msg){
        // 此处省略发邮件的逻辑
        System.out.println("sms-----direct--------->" + msg);
    }


    /**
     * @RabbitHandler 代表此方法是一个消息接收的方法。该不要有返回值
     * @RabbitListener 可作用于类上，即是整个类被监听，作用于方法上，此方法监听
     * @param msg
     */
    @RabbitListener(bindings = @QueueBinding(
            // value 对应的 是队列名字
            value = @Queue(value = StringUtils.DIRECT_QUEUE_NAME_3,autoDelete = "false"),
            // value 对应的 是交换机名字，type对应的是rabbitmq分发的模式 --- Direct模式(默认值)
            exchange = @Exchange(value = StringUtils.DIRECT_EXCHANGE_NAME,type = ExchangeTypes.DIRECT),
            // 路由key
            key = StringUtils.DIRECT_ROUTE_KEY_3
    ))
    @RabbitHandler
    public void emailService(@Payload String msg){
        // 此处省略发邮件的逻辑
        System.out.println("email-----direct--------->" + msg);
    }



}
